//
//  KINGUITextView+Emoticon.swift
//  表情键盘
//
//  Created by king on 15/8/9.
//  Copyright © 2015年 king. All rights reserved.
//

import UIKit

extension UITextView {
    func insertEmoticon(emoticon:KINGEmoticon) {
        //0、如果是删除按钮、不添加表情，而是删除字符
        if emoticon.removeEmoticon {
            deleteBackward()
            return 
        }
        //1、插入表情图片
        if emoticon.emoji != nil {
            replaceRange(selectedTextRange!, withText: emoticon.emoji!)
            return
        }
        //插入表情图片
        if emoticon.chs != nil {
            //1、获取图片，将其通过attchment转换成AttributedString,表情图片只能通过attrbutedString进行显示
            let attchment = KINGAttachment()
            attchment.image = UIImage(contentsOfFile: emoticon.imagePath)
            //保存图片所对应的文本
            attchment.chs = emoticon.chs
            //获取字体的高度
            let h = font!.lineHeight
            //设置图片的大小
            attchment.bounds = CGRect(x: 0, y: -4, width: h, height: h)
            //给imageText设置文本属性，因为跟在后面的问题或者图片会根据前面的问题或者图片的属性设置自己的属性（大小颜色）
            //如果要设置属性就要设置可变的attrString,可变的没有直接通过attchment创建的方法，需改用下面的方法
            let imageText = NSMutableAttributedString(attributedString: NSAttributedString(attachment: attchment))
            //添加属性，设置字体
            imageText.addAttribute(NSFontAttributeName, value: font!, range: NSRange(location: 0, length: 1))
            //2、将图片添加到text中
            //记录当前的光标
            let selectRange = selectedRange
            //获取textView的属性字符串
            let textAttString = NSMutableAttributedString(attributedString: attributedText)
            //替换掉用表情替换到选中的的问题
            textAttString.replaceCharactersInRange(selectedRange, withAttributedString: imageText)
            //将属性字符串重新设置给textView
            attributedText = textAttString
            //设置当前光标
            selectedRange = NSRange(location: selectRange.location + 1, length: 0)
        }
        //手动调用textVIew的代理的代理方法，插入图片不会触发代理方法
        delegate?.textViewDidChange!(self)
    }
    //如果一个方法，没有参数，有返回值，那么就可以抽取成为一个计算性属性，这样的话更为切合实际
    var emoticonText:String {
        let attrString = attributedText
        var strM = String()
        attrString.enumerateAttributesInRange(NSMakeRange(0, attrString.length), options: NSAttributedStringEnumerationOptions(rawValue: 0)) { (dict, range, _) -> Void in
            if let attachment = dict["NSAttachment"] as? KINGAttachment {
                strM += attachment.chs!
            } else {
                let str = (attrString.string as NSString).substringWithRange(range)
                strM += str
            }
        }
        return strM
    }
}

